home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / PFIX.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  19KB  |  488 lines

  1. UNIT PFix;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ PortalFix, File and MessageArea del/add       Last changed: 02.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32;
  16.  
  17. PROCEDURE ScanNetMail;
  18.  
  19. IMPLEMENTATION
  20.  
  21. USES Dos, OpRoot, OpString, OpWindow, OpDate, OpDos,
  22.      MailUtil, OpusMsg, OproUtil, Globals, StrUtil, FileUtil, LogFile,
  23.      Send2Utl, NetFile, InterCom, PoPTypes, Util, OutUtil;
  24.  
  25. TYPE
  26.   LineFuncType=FUNCTION(VAR Adr; CONST Ext:S3):STRING;
  27.  
  28. FUNCTION FWDLineFunc(VAR Adr; CONST Ext:S3): STRING; far;
  29. BEGIN
  30.   WITH TFileFwd(Adr) DO
  31.   BEGIN
  32.     FWDLineFunc:=CPad(PortalFixName,21)+ReplaceStr(Description,'XXXXXXXX.XXX');
  33.   END;
  34. END;
  35.  
  36. FUNCTION AREALineFunc(VAR Adr; CONST Ext:S3):STRING; far;
  37. BEGIN
  38.   WITH TMsgArea(Adr) DO
  39.   BEGIN
  40.     AREALineFunc:=CPad(EchoNames[1],33)+Description;
  41.   END;
  42. END;
  43.  
  44. FUNCTION TICKLineFunc(VAR Adr; CONST Ext:S3):STRING; far;
  45. BEGIN
  46.   WITH TTickArea(Adr) DO
  47.   BEGIN
  48.     TICKLineFunc:=CPad(AreaName,21)+CPad(GroupName,21)+HumanName;
  49.   END;
  50. END;
  51.  
  52. PROCEDURE ScanNetMail;
  53. VAR
  54.   pwd,KeyWord:S20;
  55.   f:FILE;
  56.   ListsAdded,SaveNodes,ListTicks,ListFiles, ListAreas:BOOLEAN;
  57.   test,msgsize,x,i : WORD;
  58.   l                : LongInt;
  59.   nt,p:POINTER;
  60.   Temp:WindowPtr;
  61.   h,h2:MsgHdrType;
  62.   n : TNodeInfo;
  63.   s : STRING;
  64.   ReplyMsg : PBufTextFile;
  65.   Ch : Char;
  66.   Adr,Dest : TFidoAddress;
  67.   ta: TTickArea;
  68.   fw: TFileFwd;
  69.   em: TMsgArea;
  70.  
  71.   PROCEDURE AddFile(CONST Name: S40;           (* Navn der skal addes     *)
  72.                     CONST Ext: S3;             (* Extension på filen      *)
  73.                     VAR Buf;                   (* Recorden der skal læses *)
  74.                     VAR NameAdr:S20;           (* Adr. på navnet i record *)
  75.                     VAR GroupAdr:S20;          (* Adr. på group name i rec*)
  76.                     Size:WORD;                 (* Record size             *)
  77.                     VAR SendToAdr1,
  78.                         SendToAdr2:SendToType; (* Adr. på sendto i record *)
  79.                     VAR KAdr:BYTE;             (* Adr. på keys i record   *)
  80.                     VAR LAdr:BYTE);            (* Adr. på level i record  *)
  81.   VAR
  82.     STab1,STab2:SendToTabType;
  83.     found,ok:BOOLEAN;
  84.     i,i2:BYTE;
  85.     f : TNetFile;
  86.   BEGIN
  87.     ok:=FALSE;
  88.     IF NOT f.Open(StartPath+'PORTAL.'+Ext,Size,False) THEN Exit;
  89.     Found:=FALSE;
  90.     WHILE NOT f.EOF DO
  91.     BEGIN
  92.       f.Read(Buf,Keep,Wait);
  93.       IF ((StUpCase(NameAdr)=name) OR (StUpCase(GroupAdr)=name)) AND
  94.          (n.keys AND KAdr=KAdr) AND (LAdr<=n.level) THEN
  95.       BEGIN
  96.         found:=True;
  97.         ok:=True;
  98.         ReadSendTo(SendToAdr2,STab2,i2);
  99.         ok:=NOT IsSendingTo(Adr,STab2,i2);
  100.         IF ok THEN
  101.         BEGIN
  102.           ReadSendTo(SendToAdr1,STab1,i);
  103.           ok:=AddToSendTo(Adr,STab1,i);
  104.           SortSendToTab(STab1,i);
  105.           WriteSendTo(STab1,SendToAdr1,i);
  106.         END;
  107.         IF ok THEN
  108.         BEGIN
  109.           f.PutRec(Buf,f.FilePos-1);
  110.           AddLog('!','PORTALFIX: Node ('+Address2Str(Adr)+') has asked to be sent "'+nameadr+'"');
  111.           ReplyMsg^.WriteLn('You will receive all new "'+nameadr+'"-files in the future.');
  112.         END ELSE
  113.         BEGIN
  114.           f.UnLock(f.FilePos-1);
  115.           ReplyMsg^.WriteLn('You are already receiving "'+nameadr+'".');
  116.         END;
  117.       END ELSE f.UnLock(f.FilePos-1);
  118.     END;
  119.     IF NOT Found THEN
  120.     BEGIN
  121.       ReplyMsg^.WriteLn('"'+name+'" not found, please ask for a list of areas...');
  122.     END;
  123.     f.Close;
  124.   END;
  125.  
  126.   PROCEDURE leaveFile(CONST name:S20;                  (* Navn der skal fjernes   *)
  127.                       CONST Ext:S3;                    (* Extension på filen      *)
  128.                       VAR Buf;                   (* Recorden der skal læses *)
  129.                       VAR NameAdr:S20;           (* Adr. på navnet i record *)
  130.                       VAR GroupAdr:S20;          (* Adr. på Group i record  *)
  131.                       CONST Size:WORD;           (* Record size             *)
  132.                       VAR SendToAdr1,
  133.                           SendToAdr2:SendToType);(* Adr. på sendto i record *)
  134.   VAR
  135.     STab1,STab2:SendToTabType;
  136.     found,ok:BOOLEAN;
  137.     i,i2:BYTE;
  138.     f : TNetFile;
  139.   BEGIN
  140.     IF NOT f.Open(StartPath+'PORTAL.'+Ext,Size,False) THEN Exit;
  141.     WHILE NOT f.EoF DO
  142.     BEGIN
  143.       ok:=FALSE;
  144.       f.Read(Buf,Keep,Wait);
  145.       Found:=(StUpCase(NameAdr)=name) OR (StUpCase(GroupAdr)=name);
  146.       IF Found THEN
  147.       BEGIN
  148.         ReadSendTo(SendToAdr1,STab1,i);
  149.         ReadSendTo(SendToAdr2,STab2,i2);
  150.         ok:=RemoveFromSendTo(Adr,STab1,i);
  151.         SortSendToTab(STab1,i);
  152.         WriteSendTo(STab1,SendToAdr1,i);
  153.         IF NOT ok AND (addr(STab1)<>addr(STab2)) THEN
  154.         BEGIN
  155.           ok:=RemoveFromSendTo(Adr,STab2,i2);
  156.           SortSendToTab(STab2,i2);
  157.           WriteSendTo(STab2,SendToAdr2,i2);
  158.         END;
  159.         IF ok THEN
  160.         BEGIN
  161.           f.PutRec(Buf,f.FilePos-1);
  162.           ReplyMsg^.WriteLn('You will NO LONGER receive "'+nameadr+'"-files');
  163.           AddLog('!','PORTALFIX: Node ('+Address2Str(Adr)+') has asked NOT to be sent "'+nameadr+'"');
  164.         END ELSE
  165.         BEGIN
  166.           ReplyMsg^.WriteLn('You were NOT receiving "'+nameadr+'" anyway.');
  167.           f.UnLock(f.FilePos-1);
  168.         END;
  169.       END ELSE
  170.         f.UnLock(f.FilePos-1);
  171.     END;
  172.     f.Close;
  173.   END;
  174.  
  175.   PROCEDURE AddAreaList(CONST Title:S20; CONST Header:S70; CONST Ext:S3;
  176.                         CONST Size:WORD; VAR Buf; VAR NameAdr:S20;
  177.                         LineFunc:LineFuncType; VAR KAdr:BYTE;
  178.                         VAR LAdr:BYTE; VAR Rec1, Rec2:SendToType);
  179.   VAR
  180.     f : TNetFile;
  181.     Tab1,Tab2:SendToTabType;
  182.  
  183.     FUNCTION IsHere:BOOLEAN;
  184.     VAR
  185.       n1,n2:BYTE;
  186.     BEGIN
  187.       ReadSendTo(Rec1,Tab1,n1);
  188.       ReadSendTo(Rec2,Tab2,n2);
  189.       IsHere:=IsSendingTo(Adr,Tab1,n1) OR IsSendingTo(Adr,Tab2,n2);
  190.     END;
  191.  
  192.   BEGIN
  193.     IF f.Open(StartPath+'PORTAL.'+Ext,Size,False) THEN
  194.     BEGIN
  195.       ListsAdded:=True;
  196.       ReplyMsg^.WriteLn('List of available '+Title+'-files to get from this system:');
  197.       ReplyMsg^.WriteLn(' '+Header);
  198.       ReplyMsg^.WriteLn(CharStr('-',76));
  199.       WHILE NOT f.EOF DO
  200.       BEGIN
  201.         f.Read(Buf,NoKeep,Wait);
  202.         IF (NameAdr<>'') AND (n.keys AND KAdr=KAdr) AND (LAdr<=n.level) THEN
  203.           ReplyMsg^.WriteLn(CHR(32+10*BYTE(IsHere))+LineFunc(Buf,Ext));
  204.       END;
  205.       f.Close;
  206.       ReplyMsg^.WriteLn(CharStr('-',76)+#13#10#13#10);
  207.     END;
  208.   END;
  209.  
  210.   PROCEDURE CheckRepost;
  211.   VAR
  212.     found, repost:BOOLEAN;
  213.     j,PointNumber:INTEGER;
  214.     Ch : Char;
  215.  
  216.     PROCEDURE ForwardAttachedFiles;
  217.     VAR
  218.       Name : PathStr;
  219.       Adr  : TFidoAddress;
  220.       SType: Byte;
  221.     BEGIN
  222.       IF (PointNumber=0) AND (NOT ((h.destnet=cfg.Addresses[Cfg.MainAdrNum].net) AND
  223.          (h.destnode=cfg.Addresses[Cfg.MainAdrNum].node))) THEN
  224.       BEGIN
  225.         ASM
  226.           and h.Attribute, Not MsgFile
  227.         END;
  228.         IF ExistFile(cfg.Inbound[nsUnknown]+JustFileName(AsciiZ2Str(h.Subject,72))) THEN
  229.           Name:=cfg.Inbound[nsUnknown]+JustFileName(AsciiZ2Str(h.Subject,72))
  230.         ELSE
  231.           IF ExistFile(cfg.Inbound[nsknown]+JustFileName(AsciiZ2Str(h.Subject,72))) THEN
  232.             Name:=cfg.Inbound[nsKnown]+JustFileName(AsciiZ2Str(h.Subject,72))
  233.           ELSE
  234.             Name:=cfg.Inbound[nsPassword]+JustFileName(AsciiZ2Str(h.Subject,72));
  235.         Adr.Zone:=Cfg.Addresses[Cfg.MainAdrNum].Zone;
  236.         Adr.Net:=h.DestNet;
  237.         Adr.Node:=h.DestNode;
  238.         Adr.Point:=PointNumber;
  239.  
  240.         IF Cfg.MailScanner.KillFWDFiles THEN SType:=STDelete ELSE SType:=STNothing;
  241.         SendAFile(Name, Adr, 'H', SType);
  242.         Repost:=True;
  243.       END;
  244.     END;
  245.  
  246.   BEGIN
  247.     repost:=FALSE;
  248.     Found:=FALSE;
  249.     IF (h.destnet=cfg.Addresses[Cfg.MainAdrNum].net) AND (h.destnode=cfg.Addresses[Cfg.MainAdrNum].node) AND
  250.        (cfg.Addresses[Cfg.MainAdrNum].point=0) THEN
  251.     BEGIN
  252.       s:='';
  253.       j:=-1;
  254.       Found:=FALSE;
  255.       REPEAT
  256.         INC(j);
  257.         ch:=CT0(p^)[j];
  258.         IF ch<>#10 THEN s:=s+ch;
  259.         IF s[Length(s)]=#13 THEN
  260.           IF (COPY(s,1,6)=#1'TOPT ') OR (COPY(s,1,6)=#1'*2PT ') THEN found:=True ELSE s:='';
  261.       UNTIL found OR (j>=l-1);
  262.       IF found AND Cfg.MailScanner.ForwardMail THEN
  263.       BEGIN
  264.         h.destpoint:=0;
  265.         ASM
  266.           and h.Attribute, Not MsgSent
  267.         END;
  268.         h.destnet:=cfg.pointnet;
  269.         s:=COPY(s,7,5);
  270.         DEC(s[0]);
  271.         VAL(s,PointNumber,j);
  272.         h.DestNode:=PointNumber;
  273.         IF j=0 THEN repost:=True;
  274.       END;
  275.     END;
  276.     IF (h.Attribute AND MsgFile)<>0 THEN ForwardAttachedFiles;
  277.     IF Repost THEN
  278.     BEGIN
  279.       IF Cfg.MailScanner.StripCrash THEN
  280.       ASM
  281.         and h.Attribute, Not MsgCrash
  282.       END;
  283.       IF Cfg.MailScanner.SaveFWDMail THEN
  284.       ASM
  285.         and h.Attribute, Not MsgKill
  286.       END ELSE
  287.       ASM
  288.         or h.Attribute, MsgKill
  289.       END;
  290.       ASM
  291.         or h.Attribute, MsgLocal
  292.       END;
  293.       s:='Reposting msg. #'+Long2Str(i);
  294.       Temp^.WFASTWRITE(s,2,2,Cfg.Color[3].TextColor);
  295.       s:=s+' to: '+AsciiZ2Str(h.touser,36);
  296.       AddLog('#', s);
  297.       s:=#1+'Via PoP v'+ver+' ('+Address2Str(Cfg.Addresses[Cfg.MainAdrNum])+') '+
  298.          DateToDateString('dd/mm-yyyy',ToDay)+' '+
  299.          CurrentTimeString('hh:mm')+#13+#10+#0;
  300.       GetMem(nt,l+Length(s));
  301.       MOVE(p^,nt^,l);
  302.       MOVE(s[1],BT0(nt^)[l],Length(s));
  303.       WriteMsg(cfg.MailScanner.NetMailDir,i,h,l+Length(s),nt);
  304.       FreeMem(nt,l+Length(s));
  305.       Temp^.WFASTWRITE(CharStr(' ',22),2,2,Cfg.Color[3].TextColor);
  306.     END;
  307.   END;
  308.  
  309.   PROCEDURE ChangePwd(CONST s:S20; VAR As:S20; CONST Title:S20);
  310.   BEGIN
  311.     IF s<>'' THEN
  312.     BEGIN
  313.       as:=s;
  314.       addlog('*','PORTALFIX: Node '+Address2Str(Adr)+' : '+Title+' password changed');
  315.       ReplyMsg^.WriteLn('Your '+Title+' password has been changed.');
  316.       SaveNodes:=True;
  317.     END;
  318.   END;
  319.  
  320. BEGIN
  321. {$IFNDEF PoPLite}
  322.   FIllChar(Call, SizeOf(Call), 0);
  323.   IF Not SetInterCom(ICScanNetMail,Call,False) OR NOT ChkDir(Cfg.MailScanner.NetMailDir) THEN Exit;
  324.   MyWin(Temp,20,8,60,11,2,'Scanning Matrix',True);
  325.   FOR i:=1 TO GetHighestMsg(Cfg.MailScanner.NetMailDir) DO
  326.   BEGIN
  327.     ListAreas:=False;
  328.     ListFiles:=False;
  329.     ListTicks:=False;
  330.     SaveNodes:=False;
  331.     IF ReadMsg(Cfg.MailScanner.NetMailDir,i,h,l,p) THEN
  332.     BEGIN
  333.       Temp^.WFastText('Scanning message #'+Long2Str(i),1,2);
  334.       IF cfg.mailscanner.stripcrash THEN
  335.       BEGIN
  336.         IF ((h.orignet<>cfg.Addresses[Cfg.MainAdrNum].net) OR (h.orignode<>cfg.Addresses[Cfg.MainAdrNum].node)) AND
  337.            ((h.Attribute AND MsgCrash)<>0) THEN
  338.         BEGIN
  339.           ASM
  340.             and h.Attribute, not (MsgCrash+MsgLocal)
  341.           END;
  342.           WriteMsg(cfg.MailScanner.NetMailDir,i,h,l,p);
  343.         END;
  344.       END;
  345.       CheckRepost;
  346.       IF (StUpCase(Trim(AsciiZ2Str(h.touser,36)))='PORTALFIX') AND ((h.Attribute AND MsgRead)=0) THEN
  347.       BEGIN
  348.         Temp^.WFastText('Processing message #'+Long2Str(i),2,2);
  349.         FindMsgAdr(h,p,l,Adr,Dest);
  350.         IF IsOurAddress(Dest) THEN
  351.         BEGIN
  352.           IF FindNodeInfo(n,Adr) THEN
  353.           BEGIN
  354.             pwd:=StUpCase(AsciiZ2Str(h.Subject,72));
  355.             IF n.areafixpwd=pwd THEN
  356.             BEGIN
  357.               x:=$FFFF;
  358.               New(ReplyMsg, Init(StartPath+'PORTAL.$$1', SCreate, 2048));
  359.               IF ReplyMsg<>NIL THEN
  360.               BEGIN
  361.                 ReplyMsg^.WriteLn(KludgeLines(Cfg.Addresses[Cfg.MainAdrNum],Adr));
  362.                 REPEAT
  363.                   s:='';
  364.                   REPEAT
  365.                     INC(x);
  366.                     ch:=CT0(p^)[x];
  367.                     IF (ch<>#10) AND (ch<>#13) AND (ch<>#$8D) THEN s:=s+ch;
  368.                   UNTIL (x>=l-1) OR (ch=#13) OR (ch=#$8D);
  369.                   s:=TrimSpaces(s);
  370.                   IF (s<>'') AND (s[1]<>#0) AND (s[1]<>^A) AND (COPY(s,1,2)<>'--') THEN
  371.                   BEGIN
  372.                     s:=StUpCase(s);
  373.                     ch:=s[1];
  374.                     CASE ch OF
  375.                       '-' : LeaveFile(COPY(s,2,255),'ARE',em,em.EchoNames[1],em.EchoNames[1],SizeOf(em),em.SendTo,em.SendOnly);
  376.                       '+' : AddFile(COPY(s,2,255),'ARE',em,em.EchoNames[1],em.EchoNames[1],SizeOf(em),
  377.                                     em.SendTo,em.SendOnly,em.keys,em.level);
  378.                       ELSE
  379.                       BEGIN
  380.                         s:=s+' ';
  381.                         replace(s,'  ',' ',0);
  382.                         KeyWord:=COPY(s,1,POS(' ',s)-1);
  383.                         DELETE(s,1,LENGTH(KeyWord)+1);
  384.                         s:=Trim(s);
  385.                         IF KeyWord='TICK' THEN
  386.                           AddFile(s,'TIC',ta,ta.areaname,ta.groupname,SizeOf(ta),ta.SendTo,ta.GetFrom,ta.keys,ta.level)
  387.                         ELSE
  388.                         IF KeyWord='NOTICK' THEN
  389.                           LeaveFile(s,'TIC',ta,ta.areaname,ta.groupname,SizeOf(ta),ta.SendTo,ta.GetFrom)
  390.                         ELSE
  391.                         IF KeyWord='FILE' THEN
  392.                           AddFile(s,'FWD',fw,fw.portalfixname,fw.portalfixname,SizeOf(fw),fw.SendTo,fw.SendTo,fw.keys,fw.level)
  393.                         ELSE
  394.                         IF KeyWord='NOFILE' THEN
  395.                           LeaveFile(s,'FWD',fw,fw.portalfixname,fw.portalfixname,SizeOf(fw),fw.SendTo,fw.SendTo) ELSE
  396.                         IF KeyWord='PASSWORD' THEN ChangePwd(s,n.AreaFixPwd,'PortalFix') ELSE
  397.                         IF KeyWord='TICKPASSWORD' THEN ChangePwd(s,n.TickPassWord,'Tick') ELSE
  398.                         IF KeyWord='SESSIONPASSWORD' THEN ChangePwd(s,n.SessionPwd,'Session') ELSE
  399.                         IF KeyWord='FORWARDLETTER' THEN
  400.                         BEGIN
  401.                           n.SendFwdLetter:=True;
  402.                           ReplyMsg^.WriteLn('You will be notified of forwarded files');
  403.                           SaveNodes:=True;
  404.                         END ELSE
  405.                         IF KeyWord='NOFORWARDLETTER' THEN
  406.                         BEGIN
  407.                           n.SendFwdLetter:=FALSE;
  408.                           ReplyMsg^.WriteLn('You will *NOT* be notified of forwarded files any more');
  409.                           SaveNodes:=True;
  410.                         END ELSE
  411.                         IF KeyWord='TICKS' THEN ListTicks:=True ELSE
  412.                           IF KeyWord='AREAS' THEN ListAreas:=True ELSE
  413.                             IF KeyWord='FILES' THEN ListFiles:=True ELSE
  414.                             BEGIN
  415.                               ReplyMsg^.WriteLn('Unknown command "'+KeyWord+'"');
  416.                             END;
  417.                       END;
  418.                     END;
  419.                   END;
  420.                 UNTIL (ch=#0) AND (x>=l-1);
  421.                 ListsAdded:=FALSE;
  422.                 IF ListFiles THEN AddAreaList('FORWARD','File name            Description','FWD',
  423.                   SizeOf(fw),fw,fw.PortalFixName,FWDLineFunc,fw.keys,fw.level,fw.sendto,fw.sendto);
  424.                 IF ListAreas THEN AddAreaList('MAIL','Area name                        Description','ARE',
  425.                   SizeOf(em),em,em.EchoNames[1],AREALineFunc,em.keys,em.level,em.sendto,em.sendonly);
  426.                 IF ListTicks THEN AddAreaList('TICK','File name            Group                Description','TIC',
  427.                   SizeOf(ta),ta,ta.AreaName,TICKLineFunc,ta.keys,ta.level,ta.sendto,ta.getfrom);
  428.                 IF ListsAdded THEN
  429.                 BEGIN
  430.                   ReplyMsg^.WriteLn('');
  431.                   ReplyMsg^.WriteLn('NOTE: an "*" in front of the area name, means you are connected to it.');
  432.                   ReplyMsg^.WriteLn('');
  433.                 END;
  434.                 Dispose(ReplyMsg, Done);
  435.               END ELSE
  436.                 AddLog('!','Not enough memory to create reply message');
  437.               IF SaveNodes THEN PutNodeInfo(n);
  438.  
  439.               FreeMemCheck(p,l);
  440.  
  441.               Assign(f,StartPath+'PORTAL.$$1'); FileMode:=ShareRead+ShareDenyW;
  442.               Reset(f,1);
  443.               IF IOResult=0 THEN
  444.               BEGIN
  445.                 MsgSize:=FileSize(f)+1;
  446.                 IF GetMemCheck(p,msgsize) THEN
  447.                 BEGIN
  448.                   FillChar(p^,msgsize,0);
  449.                   BlockRead(f,p^,FileSize(f),test);
  450.                   FillChar(h2,SizeOf(h2),0);
  451.                   Move(h.fromuser,h2.touser,36);
  452.                   Move(h.touser,h2.fromuser,36);
  453.                   h2.orignet:=cfg.Addresses[Cfg.MainAdrNum].net;
  454.                   h2.orignode:=cfg.Addresses[Cfg.MainAdrNum].node;
  455.                   h2.destnode:=h.orignode;
  456.                   h2.destnet:=h.orignet;
  457.                   h2.attribute:=MsgKill+MsgLocal;
  458.                   SetTimeStamp(h2);
  459.                   WriteMsg(cfg.mailscanner.netmaildir,GetHighestMsg(cfg.mailscanner.NetMailDir)+1,h2,MsgSize-1,p);
  460.                   FreeMem(p,msgsize);
  461.                 END;
  462.                 Close(f);
  463.                 DeleteFile(StartPath+'PORTAL.$$1');
  464.               END;
  465.             END ELSE
  466.               AddLog('!','PORTALFIX: Node '+Address2Str(Adr)+': specified invalid password "'+pwd+'"');
  467.           END ELSE
  468.             AddLog('!','PORTALFIX: Node '+Address2Str(Adr)+' tried to use PORTALFIX');
  469.           ASM
  470.             or h.Attribute, MsgRead
  471.           END;
  472.         END;
  473.         ASSIGN(f,Cfg.MailScanner.NetMailDir+Long2Str(i)+'.MSG'); FileMode:=ShareRW+ShareDenyRW;
  474.         RESET(f,1);
  475.         BLOCKWRITE(f,h,SizeOf(h),x);
  476.         CLOSE(f);
  477.         Temp^.WFastWrite(CharStr(' ',28),2,2,Cfg.Color[2].TextColor);
  478.       END;
  479.       IF p<>NIL THEN FreeMemCheck(p,l);
  480.     END;
  481.   END;
  482.   SetInterCom(ICIdle,Call,False);
  483.   KillWindow(Temp);
  484. {$ENDIF}
  485. END;
  486.  
  487. END.
  488.